/*
 * 使用示例：如何使用键盘事件回调
 */
#include "interceptor.h"
#include "uiohook.h"
#include <stdio.h>

// 同步C回调函数（栈分配模式）
void my_keyboard_handler_sync(const keyboard_event_data_t* event_data) {
    const char* event_name;
    
    switch(event_data->event_type) {
        case EVENT_KEY_PRESSED:
            event_name = "KEY_PRESSED";
            break;
        case EVENT_KEY_RELEASED:
            event_name = "KEY_RELEASED";
            break;
        case EVENT_KEY_TYPED:
            event_name = "KEY_TYPED";
            break;
        default:
            event_name = "UNKNOWN";
            break;
    }
    
    printf("[同步回调] %s - keycode=%u, rawcode=0x%X, keychar=%lc\n", 
           event_name, event_data->keycode, event_data->rawcode, event_data->keychar);
}

// 异步回调函数（堆分配模式，适用于跨语言调用）
void my_keyboard_handler_async(keyboard_event_data_t* event_data) {
    const char* event_name;
    
    switch(event_data->event_type) {
        case EVENT_KEY_PRESSED:
            event_name = "KEY_PRESSED";
            break;
        case EVENT_KEY_RELEASED:
            event_name = "KEY_RELEASED";
            break;
        case EVENT_KEY_TYPED:
            event_name = "KEY_TYPED";
            break;
        default:
            event_name = "UNKNOWN";
            break;
    }
    
    printf("[异步回调] %s - keycode=%u, rawcode=0x%X, keychar=%lc\n", 
           event_name, event_data->keycode, event_data->rawcode, event_data->keychar);
    
    // 重要：在堆分配模式下，必须释放内存
    free_keyboard_event_data(event_data);
}

int main() {
    printf("选择模式:\n");
    printf("1 - 栈分配模式（同步C回调）\n");
    printf("2 - 堆分配模式（跨语言异步调用）\n");
    printf("输入选择 (1 或 2): ");
    
    int choice;
    scanf("%d", &choice);
    
    if (choice == 1) {
        printf("使用栈分配模式...\n");
        set_keyboard_callback(my_keyboard_handler_sync);
    } else if (choice == 2) {
        printf("使用堆分配模式...\n");
        set_keyboard_callback_heap(my_keyboard_handler_async);
    } else {
        printf("无效选择，使用默认栈分配模式...\n");
        set_keyboard_callback(my_keyboard_handler_sync);
    }
    
    // 设置hook分发处理器
    wrapper_hook_dispatch_proc();
    
    printf("键盘监听已启动，按ESC退出...\n");
    
    // 启动hook
    int status = hook_run();
    
    if (status != UIOHOOK_SUCCESS) {
        printf("Hook启动失败: %d\n", status);
        return -1;
    }
    
    return 0;
}
